home *** CD-ROM | disk | FTP | other *** search
/ PC World Komputer 2010 April / PCWorld0410.iso / hity wydania / Ubuntu 9.10 PL / karmelkowy-koliberek-desktop-9.10-i386-PL.iso / casper / filesystem.squashfs / usr / bin / rarian-sk-update < prev    next >
Text File  |  2009-10-22  |  10KB  |  425 lines

  1. #!/bin/bash
  2.  
  3. # This script is designed to replace scrollkeeper-update
  4. # It iterates through all the directories specified using -o <dir_list>
  5. # If these aren't specified, the default convert_dir is used
  6. # (typically /usr/share/omf) and checks whether the last-modified time for
  7. # the directory has changed from the previous run.
  8. # The previous timings are stored in output_dir/.rarian-update-mtimes
  9. # in the file format:
  10. # <mtime>:@:<dir_name>:@:<converted filenames>
  11. # For top-level directories, the mtime is '0'
  12. # When multiple scrolls are generated from a single omf subdir,
  13. # the scroll names are seperated by a semi-colon.
  14.  
  15. # I'll annotate the rest of the scirpt
  16. # If you want more info, please ping me and I'll try and help.
  17.  
  18.  
  19. prefix=/usr
  20. exec_prefix=/usr
  21. bindir=/usr/bin
  22. statedir=/var/lib/rarian
  23. convert_dir=/usr/share/omf
  24. datarootdir=/usr/share
  25. datadir=/usr/share
  26. output_dir=${datadir}/help
  27. package_version=0.8.1
  28. real_convert[0]=$convert_dir
  29. skip_omf_translate=1
  30.  
  31. # Print the version info for this file
  32. print_version()
  33. {
  34.     echo "`basename $0` version 0.9"
  35.     echo "This script is distributed as part of Rarian v$package_version"
  36.     echo "Use '`basename $0` --help' for options and instructions for running"
  37.     echo ""
  38.     echo "Have a nice day!"
  39.  
  40.     exit 0
  41. }
  42.  
  43. # Standard help message
  44. print_usage()
  45. {
  46.     echo "Usage: `basename $0` [OPTIONS]"
  47.     echo "Update Rarian scrolls archive from scrollkeeper omf files."
  48.     echo "Note: This script is a replacement for scrollkeeper-update, but"
  49.     echo "does not update the scrollkeeper internal database."
  50.     echo ""
  51.     echo "Options:"
  52.     echo -e "-o DIR\t\t\t\tUse the specified omf directories for"
  53.     echo -e "\t\t\t\tconversion. Multiple directories can be "
  54.     echo -e "\t\t\t\tspecified using colon (:) separator."
  55.     echo -e "-r DIR\t\t\t\tUse the specified directory for the"\
  56.             "resulting"
  57.     echo -e "\t\t\t\tscrolls.  If the directory doesn't exist, it"
  58.     echo -e "\t\t\t\twill be created at run time."
  59.     echo -e "\t\t\t\t Note: Multiple output paths are not supported"
  60.     echo -e "--c\t\t\t\tRebuild the index entirely.  This will rebuild"
  61.     echo -e "\t\t\t\tall scroll files and may take a long time."
  62.     echo -e "-v\t\t\t\tTurn Verbosity on."
  63.     echo -e "-p\t\t\t\tSpecify a different place to store the mtimes file."
  64.     echo -e "-q\t\t\t\tRun silently (default)."
  65.     echo -e "-h, -?\t\t\t\tPrint this help message and exit."
  66.     echo ""
  67.     echo "Using this script without option will use the default omf directory"
  68.     echo "'$convert_dir' and the default output directory '$output_dir'"
  69.  
  70.     echo ""
  71.     if [ $skip_omf_translate != 0 ]
  72.          then
  73.         echo "NOTE (2): This script doesn't do anything and is "
  74.         echo "only provided for scrollkeeper compatibility"
  75.     fi
  76.     exit 0
  77. }
  78.  
  79. # Nice print function to call when we're in verbose mode.
  80. # In normal mode, it's a no-op.
  81. print_verbose()
  82. {
  83.     if [ $verbose ]
  84.     then
  85.         echo "$1"
  86.     fi
  87. }
  88.  
  89.  
  90. # Process_dir handles the calling of the migration program
  91. # It calls the program with the correct parameters
  92. # and moves the results to the correct place.
  93. process_dir()
  94. {
  95.     fname_list=""
  96.     old_basename=""
  97.     for f in $1/*.omf; do
  98.         bname=$(basename $f)
  99.         bname=${bname%-*.omf}
  100.         if [[ $bname != $old_basename ]]
  101.         then
  102.             old_basename=$bname
  103.             filename=$bname.document
  104.             fname_list=$fname_list$filename";"
  105.             if $bindir/rarian-sk-migrate $(dirname $f) ${bname%-*.omf} > $tmpdir/tmp.rarian
  106.             then
  107.                 cp $tmpdir/tmp.rarian $output_dir/$filename
  108.                 rm $tmpdir/tmp.rarian
  109.             else
  110.                 echo "Error: Cannot process file "$f".  See "$tmpdir"/tmp.rarian for the reason."
  111.                 exit 5
  112.             fi
  113.         fi
  114.     done
  115.     echo -e `stat -c %Y $1`':@:'$1':@:'$fname_list >> $tmpdir/rarian-updates
  116. }
  117.  
  118. # Split up the omf dirs specified on the command line
  119. # I've never seen this used in practice, but
  120. # better safe than sorry
  121. split_omf_dirs ()
  122. {
  123.     let counter=0
  124.     while [ $convert_dir ]
  125.     do
  126.         entry=`echo $convert_dir | cut -d ':' -f 1`
  127.         convert_dir=${convert_dir#$entry}
  128.         convert_dir=${convert_dir#:}
  129.         real_convert[$counter]=$entry
  130.         let counter+=1
  131.     done
  132.  
  133. }
  134.  
  135. # Determine whether the directory defined within the index file
  136. # was specified in the convert_dirs
  137. am_adding_dir ()
  138. {
  139.     let counter=0
  140.     am_processing="0"
  141.     for i in ${real_convert[@]}
  142.     do
  143.         if [[ $fname == $i ]]
  144.         then
  145.             real_convert[$counter]="0"
  146.             am_processing="1"
  147.             return
  148.         fi
  149.         let counter+=1
  150.     done
  151. }
  152.  
  153. # The directory wasn't specified.  This does nothing except cat the
  154. # relevant lines from the old file to the new one
  155. skip_directory ()
  156. {
  157.     read line
  158.     time=`echo $line | awk -F ":@:" '{print $1}'`
  159.     while [[ $time -ne 0 ]]
  160.     do
  161.         echo $line
  162.         echo $line >> $tmpdir/rarian-updates
  163.         read line
  164.         time=`echo $line | awk -F ":@:" '{print $1}'`
  165.     done
  166. }
  167.  
  168. # Go through the given directory and add all subdirs (containing omfs)
  169. # to the index file (and convert the omf's to scrolls)
  170. add_all_files ()
  171. {
  172.     for i in $(ls $fname);
  173.     do
  174.         if [ -d $fname/$i ]
  175.         then
  176.             print_verbose "$fname/$i is new and will be added"
  177.             process_dir $fname/$i
  178.         fi
  179.     done
  180.     read line
  181. }
  182.  
  183. # If the given directory actually exists within the omf dir
  184. dirs_contains ()
  185. {
  186.     let counter=0
  187.     am_processing="0"
  188.     for i in ${entries[@]}
  189.     do
  190.         if [[ $1 == $i ]]
  191.         then
  192.             entries[$counter]="0"
  193.             am_processing="1"
  194.             return
  195.         fi
  196.         let counter+=1
  197.     done
  198. }
  199.  
  200. # The meat.  Goes through and checks each directory mtime against the
  201. # cached version.  If they're different, regenerate the scroll.
  202. # If the dir has been removed, delete.
  203. process_directory ()
  204. {
  205.     let counter=0
  206.     for i in  $(ls $fname)
  207.     do
  208.         entries[$counter]="$fname/$i"
  209.         let counter+=1
  210.     done
  211.  
  212.     read line
  213.  
  214.     old_time=`echo $line | awk -F ":@:" '{print $1}'`
  215.  
  216.     while [[ $old_time && $old_time != "0" ]]
  217.     do
  218.         name=`echo $line | awk -F ":@:" '{print $2}'`
  219.  
  220.         dirs_contains $name
  221.  
  222.         if [[ $am_processing != "0" ]]
  223.         then
  224.             new_time=`stat -c %Y $name`
  225.             if [[ $new_time -ne $old_time ]]
  226.             then
  227.                 print_verbose "Directory $name has changed.  Updating."
  228.                 process_dir $name
  229.             else
  230.                 echo $line >> $tmpdir/rarian-updates
  231.             fi
  232.         else
  233.             filenames=`echo $line | awk -F ":@:" '{print $3}'`
  234.             while [[ $filenames ]]
  235.             do
  236.                 entry=`echo $filenames | cut -d ';' -f 1`
  237.                 print_verbose "Directory resonsible for $entry has been removed.  Deleting"
  238.                 filenames=${filenames#$entry}
  239.                 filenames=${filenames#;}
  240.                 mv $entry $tmpdir
  241.             done
  242.  
  243.         fi
  244.  
  245.         read line
  246.         old_time=`echo $line | awk -F ":@:" '{print $1}'`
  247.     done
  248.  
  249.     for i in ${entries[@]}
  250.     do
  251.         if [[ $i != "0" ]]
  252.         then
  253.             print_verbose "Directory $i is new and will be added."
  254.             process_dir $i
  255.         fi
  256.     done
  257. }
  258.  
  259.  
  260.  
  261. # Beginning of the main chunk of the script
  262.  
  263. # Sorry for the stupid naming of options.
  264. # They are inherited from scrollkeeper :(
  265.  
  266. # We use TEMP as set -- seems to nuke the return value of getopt
  267. TEMP=`getopt -u -n$(basename $0) -o "o:r:p:vqnhV" \
  268.              -- "$@"` \
  269.     || print_usage
  270.  
  271. if [ $? != 0 ] ; then
  272.     print_usage
  273.     exit 0
  274. fi
  275.  
  276. eval set -- "$TEMP"
  277.  
  278. while true; do
  279.     case "$1" in
  280.         -o )
  281.             convert_dir=$2
  282.             update_output_dir=1
  283.             shift 2
  284.             ;;
  285.         -r )
  286.             output_dir=$2
  287.             overload_update=1
  288.             shift 2
  289.             ;;
  290.         -v )
  291.             verbose=1
  292.             shift
  293.             ;;
  294.         -q )
  295.             shift
  296.             ;;
  297.         -c )
  298.             clean_index=1
  299.             shift
  300.             ;;          
  301.         -h | -\? )
  302.             print_usage
  303.             ;;
  304.         -n )
  305.             # Scrollkeeper compat.  Actually do nothing
  306.             shift
  307.             ;;
  308.             -p )
  309.                     statedir=$2
  310.                     shift 2
  311.             ;;
  312.         -V | --version )
  313.             print_version
  314.             ;;
  315.          * )
  316.              break
  317.              ;;
  318.     esac
  319. done
  320.  
  321. if [ $verbose ]
  322. then
  323.     echo "Verbosity turned on"
  324. fi
  325.  
  326. if [ $skip_omf_translate = 0 ]
  327. then
  328.  
  329. split_omf_dirs
  330.  
  331. if [ $update_output_dir ] && [ ! $overload_update ]
  332. then
  333.     # We assume here that people are sensible and put the 
  334.     # omf files in <prefix>/share/omf
  335.     # Also assumes only a single omf path
  336.     print_verbose "Using non-installed location"
  337.     output_dir=`dirname $real_convert[0]`/help
  338. fi
  339.  
  340. print_verbose "Outputting to $output_dir"
  341.  
  342. if [ $clean_index ]
  343. then
  344.     print_verbose "Removing index file $statedir/rarian-update-mtimes"
  345.     rm $statedir/rarian-update-mtimes > /dev/null 2>&1
  346. fi
  347.  
  348.  
  349. tmpdir=/tmp/rarian-$RANDOM
  350. mkdir $tmpdir
  351.  
  352. if [ ! -d $output_dir ]
  353. then
  354.     mkdir -p $output_dir
  355. fi
  356.  
  357. if [ ! -d $statedir ]
  358. then
  359.     mkdir -p $statedir
  360. fi
  361.  
  362.  
  363. res=$(touch $statedir/rarian-update-mtimes > /dev/null 2>&1)
  364.  
  365. if [ $? -ne 0  ]
  366. then
  367.     echo "Error: Unable to write to the output directory $output_dir."
  368.     echo "write permission is needed in order to run"
  369.     echo "this script.  If you don't have it, things"
  370.     echo "break.  Please run this script with the correct"
  371.     echo "permissions (normally root).  Exiting."
  372.     exit 3
  373. fi
  374.  
  375. exec < $statedir/rarian-update-mtimes
  376.  
  377. read line
  378. fname=`echo $line | awk -F ":@:" '{print $2}'`
  379.  
  380.  
  381. while [[ $fname != "" ]]
  382. do
  383.     print_verbose "Processing directory $fname"
  384.     echo "0:@:$fname" >> $tmpdir/rarian-updates
  385.     am_adding_dir $fname
  386.     if [[ ! $(ls $fname 2>&1) ]]
  387.     then
  388.         print_verbose "Previous directory $fname no longer exists"
  389.     else
  390.         if [[ $am_processing != "0" ]]
  391.         then
  392.         process_directory
  393.         else
  394.         skip_directory
  395.         fi
  396.         fname=`echo $line | awk -F ":@:" '{print $2}'`
  397.     fi
  398. done
  399.  
  400. for i in ${real_convert[@]}
  401. do
  402.     if [[ $i != "0" ]]
  403.     then
  404.     res=$(ls $i 2>/dev/null)
  405.     if [[ ! $res ]]
  406.     then
  407.         print_verbose "Path $i does not exist.  Ignoring"
  408.     else
  409.         
  410.         print_verbose "Adding contents of directory $i"
  411.         fname=$i
  412.         echo "0:@:$fname" >> $tmpdir/rarian-updates
  413.         add_all_files
  414.     fi
  415.     fi
  416. done
  417.  
  418. rm -f $statedir/rarian-update-mtimes
  419. if [ -e $tmpdir/rarian-updates ]
  420. then
  421.     mv $tmpdir/rarian-updates $statedir/rarian-update-mtimes
  422. fi
  423. rm -rf $tmpdir
  424.  
  425. fi # ENABLE_OMF_READ